<?php

require_once "config.inc";

/* получить обработаный шаблон */
function get_template ($name, $stash_param = '') {
    global $templates_dir, $templates_extension;

    $template_content = file_get_contents($templates_dir . $name . $templates_extension);

    if ($template_content ) {
        $rendered_template_content = render_template( $template_content, $stash_param );

        return $rendered_template_content;
    } else {
        return '';
    }
}

define('INCLUDE_PARSE',     "/{include\s+'(.+?)'}/");
define('VAR_PARSE',         "/{var\s+'(.+?)'}/");
define('ARRAY_PARSE',       "/{repeat_array\s+'(.+?)'\s+'(.+?)'}/" );
define('ARRAY_BLOCK_PARSE', "/{repeat_array}(.+?){'(.+?)'}/s" );
define('IF_PARSE',          "/{if\s+'(.+?)'}(.+?){fi}/s");

/* произвести обработку шаблона */
function render_template($template_content, $stash) {
 
    callback_template_include($stash, TRUE);
    callback_template_var($stash, TRUE);
    callback_template_array($stash, TRUE);
    callback_template_if($stash, TRUE);

    $rendered_template_content =
        preg_replace_callback(
            INCLUDE_PARSE,
            'callback_template_include',
            $template_content
        );

    $rendered_template_content =
        preg_replace_callback(
            VAR_PARSE,
            'callback_template_var',
            $rendered_template_content
        );

    $rendered_template_content =
        preg_replace_callback(
            ARRAY_PARSE,
            'callback_template_array',
            $rendered_template_content
        );

    $rendered_template_content =
        preg_replace_callback(
            ARRAY_BLOCK_PARSE,
            'callback_template_array',
            $rendered_template_content
        );

    $rendered_template_content =
        preg_replace_callback(
            IF_PARSE,
            'callback_template_if',
            $rendered_template_content
        );

    return $rendered_template_content;
}

/* колбэка на подстановку переменных */
function callback_template_var($match, $init = FALSE) {
    static $stash;

    if ($init) {
        $stash = $match;
        return;
    }

    return $stash[$match[1]];
}

/* колбэк на инклуд шаблонов */
function callback_template_include($match, $init = FALSE) {
    static $stash;

    if ($init) {
        $stash = $match;
        return;
    }

    return get_template( $match[1], $stash );
}

/* колбэк на if блок */
/* TODO fix possible recursion include bug */
function callback_template_if($match, $init = FALSE) {
    static $stash;

    if ($init) {
        $stash = $match;
        return;
    }
    
    if ( $stash[$match[1]] ) {
        return $match[2];
    } else {
        return '';
    }
}

/* колбэк на подстановку массивов */
function callback_template_array($match, $init = FALSE) {  
    static $stash;

    if ($init) {
        $stash = $match;
        return;
    }
    
    if ($stash[$match[2]]) {

        foreach ($stash[$match[2]] as $hash) {
            //var_dump($hash);
            //echo "\n<br><br>";

            if (is_array($hash)) {
                $result_block .= safe_eval($match[1], $hash);
            } else {
                $tmp_hash[val] = $hash;
                $result_block .= safe_eval($match[1], $tmp_hash);
            }
        }

        return $result_block;
    } else {
        return '';
    }
}


/* безопасный eval */
function safe_eval($str, $hash) {
    subst_values($hash, TRUE);

    $result_block .= preg_replace_callback(
        '/\$([a-z\d_-]+)/i',
        'subst_values',
        $str
    );

    return $result_block;
}

/* safe eval callback =) */
function subst_values($match, $init = FALSE) {
    static $stash;

    if ($init) {
        $stash = $match;
        return;
    }

    return $stash[$match[1]];
}

?>
